/* eslint-disable @typescript-eslint/no-explicit-any */
import { NextRequest, NextResponse } from "next/server";
import * as XLSX from "xlsx";

export async function POST(request: NextRequest) {
  try {
    const formData = await request.formData();
    const file = formData.get("file") as File;

    if (!file) {
      return NextResponse.json(
        { error: "没有提供文件" },
        { status: 400 }
      );
    }

    // 检查文件类型
    const isExcel = 
      file.name.endsWith(".xlsx") || 
      file.name.endsWith(".xls") || 
      file.name.endsWith(".csv");

    if (!isExcel) {
      return NextResponse.json(
        { error: "请上传 Excel 或 CSV 文件" },
        { status: 400 }
      );
    }

    // 读取文件内容
    const arrayBuffer = await file.arrayBuffer();
    const workbook = XLSX.read(arrayBuffer, { type: "array" });

    // 获取第一个工作表
    const sheetName = workbook.SheetNames[0];
    const worksheet = workbook.Sheets[sheetName];
    
    // 获取工作表范围
    const range = XLSX.utils.decode_range(worksheet['!ref'] || 'A1');
    
    // 创建一个表头映射，用于处理合并单元格
    const headerMap: { [key: string]: any } = {};
    
    // 处理合并单元格
    if (worksheet['!merges']) {
      worksheet['!merges'].forEach((merge) => {
        // 只处理第一行的合并单元格（表头）
        if (merge.s.r === 0) {
          // 获取合并单元格的值（使用左上角单元格的值）
          const cellAddress = XLSX.utils.encode_cell({ r: merge.s.r, c: merge.s.c });
          const cellValue = worksheet[cellAddress] ? worksheet[cellAddress].v : '';
          
          // 将合并单元格的值应用到所有被合并的列
          for (let c = merge.s.c; c <= merge.e.c; c++) {
            headerMap[c] = cellValue;
          }
        }
      });
    }
    
    // 提取表头（第一行），考虑合并单元格
    const headers = [];
    for (let C = range.s.c; C <= range.e.c; ++C) {
      // 如果这个列在合并单元格中，使用合并单元格的值
      if (C in headerMap) {
        headers.push(headerMap[C]);
      } else {
        // 否则使用单元格自己的值
        const cellAddress = XLSX.utils.encode_cell({ r: range.s.r, c: C });
        const cell = worksheet[cellAddress];
        headers.push(cell ? cell.v : ''); // 如果单元格为空，则添加空字符串
      }
    }
    
    // 提取表体数据（从第二行开始）
    const rows = [];
    for (let R = range.s.r + 1; R <= range.e.r; ++R) {
      const row = [];
      for (let C = range.s.c; C <= range.e.c; ++C) {
        const cellAddress = XLSX.utils.encode_cell({ r: R, c: C });
        const cell = worksheet[cellAddress];
        row.push(cell ? cell.v : ''); // 如果单元格为空，则添加空字符串
      }
      rows.push(row);
    }

    // 处理特殊表头逻辑
    // 查找前5行中第一个值为空字符串的行
    const subHeaderRows = [];
    const maxRowsToCheck = Math.min(5, rows.length);
    
    for (let i = 0; i < maxRowsToCheck; i++) {
      if (rows[i] && rows[i][0] === '') {
        subHeaderRows.push(rows[i]);
      }
    }
    
    // 创建一个映射来存储相同表头的子表头值
    const headerToSubValues: { [key: string]: string[] } = {};
    
    // 收集每个表头的子表头值
    for (let colIndex = 0; colIndex < headers.length; colIndex++) {
      const headerName = headers[colIndex];
      
      // 如果这个表头名称还没有在映射中，初始化一个空数组
      if (!headerToSubValues[headerName]) {
        headerToSubValues[headerName] = [];
      }
      
      // 收集该列的子表头值
      for (const subHeaderRow of subHeaderRows) {
        if (subHeaderRow[colIndex] && subHeaderRow[colIndex] !== '') {
          headerToSubValues[headerName].push(subHeaderRow[colIndex]);
        }
      }
    }
    
    // 处理表头
    const processedHeaders: any[] = [];
    const processedHeaderNames = new Set(); // 用于跟踪已处理的表头名称
    
    for (let colIndex = 0; colIndex < headers.length; colIndex++) {
      const headerName = headers[colIndex];
      
      // 如果这个表头名称已经处理过，跳过
      if (processedHeaderNames.has(headerName)) {
        continue;
      }
      
      // 标记这个表头名称为已处理
      processedHeaderNames.add(headerName);
      
      const subValues = headerToSubValues[headerName];
      
      if (subValues && subValues.length > 0) {
        // 如果有子表头值，创建对象
        const headerObj: any = {};
        headerObj[headerName] = subValues;
        processedHeaders.push(headerObj);
      } else {
        // 如果没有子表头值，保持原始表头
        processedHeaders.push(headerName);
      }
    }
    
    // 从数据中移除子表头行
    for (const subHeaderRow of subHeaderRows) {
      const index = rows.indexOf(subHeaderRow);
      if (index !== -1) {
        rows.splice(index, 1);
      }
    }

    return NextResponse.json({
      fileName: file.name,
      sheetName: sheetName,
      headers: processedHeaders,
      data: rows
    });
   
  } catch (error) {
    console.error("解析 Excel 文件时出错:", error);
    return NextResponse.json(
      { error: "处理文件时出错" },
      { status: 500 }
    );
  }
} 